/*************************************************
* Title：TinyToolKit
* Author：Opportunity 
* Discribe：定义对象池接口
* CreateTime：2020-04-05 21:33:30
* Version：1.0
* Modify Recoder：
*************************************************/
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace TinyToolKit.ObjectPool
{
    public interface IObjectPool<T> where T : class
    {
        string Name { get; set; }
        int Capacity { get; }//获取对象池的容量
        int usingCount { get; }//获取场景中正在使用的对象数量
        int unUsedCount { get; }//当前未被使用的对象数量
        bool IsAutoRelease { get; }//判断是否自动释放对象
        float AutoReleaseTime { get; }//获取自动释放的时间  

        /// <summary>
        /// 获取对象
        /// </summary>
        /// <returns>返回要获取的对象</returns>
        T Spawn();

        /// <summary>
        /// 归还对象到对象池中
        /// </summary>
        /// <param name="obj">需要归还的对象</param>
        bool Recycle(T obj);

        /// <summary>
        /// 归还对象到对象池中
        /// </summary>
        /// <param name="obj">需要归还的对象</param>
        bool Recycle(object obj);

        /// <summary>
        /// 尝试释放对象池中一定数量的对象
        /// </summary>
        /// <param name="releaseCount">尝试释放的数量</param>
        void Release(int releaseCount);

        /// <summary>
        /// 释放对象池中所有未被使用的对象
        /// </summary>
        void ReleaseAllUnused();

        /// <summary>
        /// 激活按照一定时间间隔自动释放未使用的资源
        /// </summary>
        /// <param name="autoReleaseInterval">自动释放资源的时间间隔</param>
        /// <param name="destroyFunc">销毁对象的回调函数</param>
        void ActiceAutoRelease(float autoReleaseInterval);

        void DeacticeAutoRelease(); 

        /// <summary>
        /// 更新对象池的操作
        /// </summary>
        /// <param name="deltaTime"></param>
        void Update(float deltaTime);

        /// <summary>
        /// 释放对象池的操作
        /// </summary>
        void ShutDown();
    }
}
